package com.hmk.blogboot.service.Impl;

import com.hmk.blogboot.NotFoundException;
import com.hmk.blogboot.dao.TagRepository;
import com.hmk.blogboot.po.Tag;
import com.hmk.blogboot.service.TagService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;


@Service
public class TagServiceImpl implements TagService {

    //自动注入tagRepository接口
    @Autowired
    private TagRepository tagRepository;

    //添加标签
    @Override
    @Transactional
    public Tag saveTag(Tag tag) {
        //tagRepository接口调用sava(tag)
        return tagRepository.save(tag);
    }

    @Override
    @Transactional
    public Tag getTag(Long id) {
        //根据id进行获取tag
        return tagRepository.getOne(id);
    }

    @Override
    public Tag getTagByName(String name) {
        //根据分类名称获取tag记录
        return tagRepository.findByName(name);
    }

    @Override
    @Transactional
    public Page<Tag> listTag(Pageable pageable) {
        //分页查询tag记录
        return tagRepository.findAll(pageable);
    }

    @Override
    @Transactional
    public Tag updateTag(Long id, Tag tag) {
        //根据id进行查询tag标签记录
        Tag t =tagRepository.getOne(id);
        if(t==null){
            throw new NotFoundException("不存在该标签");
        }
        //使用spring提供BeanUtils工具类调用copyProperties方法进行复制属性到另一个tag对象
        //修改tag属性复制给t，保存到数据库中
        BeanUtils.copyProperties(tag,t);
        return tagRepository.save(t);
    }

    @Override
    @Transactional
    public void deleteTag(Long id) {
        tagRepository.deleteById(id);
    }

    /*根据一组tagid 进行字符串拼接ids获取list<tag>*/
    @Override
    public List<Tag> listTag(String ids) {
        //使用repository接口提供得list类型id 获取对应一组list tag
        //但是传进来字符串 "1,2,3,4,5"形式，将"1,2,3,4,5"转换成list类型存储
        return tagRepository.findAllById(convertToList(ids));
    }

    //字符串 "1,2,3,4,5"形式，将"1,2,3,4,5"转换成list类型存储
    private  List<Long>  convertToList(String ids){
        //创建初始化list容器对象 存储long类型id
        List<Long> list = new ArrayList<>();
        //进行判断，如果ids字符串不为空或者不为空字符串
        if(!"".equals(ids) && ids!=null){
            //定义字符串数据，字符串ids按 , 进行分割 一个一个id(字符串类型)
            String[] idarray = ids.split(",");
            for(int i =0; i<idarray.length;i++){
                //字符串类型id 通过Long的构造函数，转换类型Long类型存储list容器
                list.add(new Long(idarray[i]));
            }
        }
        return list;
    }


    @Override
    public List<Tag> listTag() {
        return tagRepository.findAll();
    }


    /*
    * @param 表示以参数值进行排序
    *
    * */
    @Override
    public List<Tag> listTagTop(Integer size) {
        //jpa中sort字段
        Sort sort = Sort.by(Sort.Direction.DESC, "blogs.size");
        //创建Pageable对象 使用PageRequest调用静态方法of()方法获取pageable对象
        Pageable pageable = PageRequest.of(0,size,sort);
        return tagRepository.findTop(pageable);
    }
}
